//
// Created by libtity on 2024/7/4.
//

#ifndef COMPLIER_TABLE_H
#define COMPLIER_TABLE_H

#include "bits/stdc++.h"

using namespace std;

struct f_table {
    int label;
    string func_name;
    string func_return_type;
    int ref;
    int func_level;
    int func_outer;
    int size_of_frame;
};

struct v_table {
    int label;
    string name;
    string kind;
    int level;
    int outer;
    string type;
    string para;
    int ref;
};

struct State {
    int label, level;
    string name;
    string type;
    string return_type;
    stack<int> outer_func;
    bool in_kuohao;
    bool func_diaoyong;
};

class Table {
    fstream fs1, fs2;
    State state;

    stack<pair<string, string>> token_stack;

    vector<f_table> func_table;
    vector<v_table> var_table;

public:
    Table();

    void run(string path_input, string path_output);

private:
    pair<string, string> get_token();

    void update_var_ref(string name);

    void createVar();

    void createFunc();

    int get_var_index(string var_name, string type1) {
        for (int i = 0; i < var_table.size(); i++) {
            if (var_table[i].name == var_name) {
                if (var_table[i].type == type1 || type1.empty()) {
                    return i;
                }
            }
        }
        return -1;
    }

    int get_func_index(string func_name) {
        for (int i = 0; i < func_table.size(); i++) {
            if (func_table[i].func_name == func_name) {
                return i;
            }
        }
        return -1;
    }
};


#endif //COMPLIER_TABLE_H
